const { defineConfig } = require('@vue/cli-service')
const path = require('path')

const CompressionWebpackPlugin = require('compression-webpack-plugin')

// gzip压缩文件类型
const productionGzipExtensions = ['js', 'css', 'scss']

function resolve(dir) {
  return path.join(__dirname, dir)
}
function addStyleResource(rule) {
  rule
    .use('style-resource')
    .loader('style-resources-loader')
    .options({
      patterns: [
        path.resolve(__dirname, 'src/assets/stylus/style.less'), // 需要全局导入的less
      ],
    })
  // console.log(path.resolve(__dirname, "src/assets/stylus/style.less"));
}

module.exports = defineConfig({
  transpileDependencies: true,
  publicPath: process.env.NODE_ENV === 'production' ? './' : './',
  lintOnSave: false,
  devServer: {
    // host: '127.0.0.1',
    //端口号
    port: 8888,
    //自动打开浏览器
    open: true,
  },
  css: {
    // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中
    extract: false,
    loaderOptions: {
      less: {
        javascriptEnabled: true,
      },
    },
  },
  // 打包动态版本号
  filenameHashing: true,
  // 是否为 Babel 或 TypeScript 使用 thread-loader
  parallel: false,
  // 传递任何第三方插件选项
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'less',
      patterns: [
        // 'E:\\gmn\\apfc\\public\\iview-theme\\index.less'
        path.resolve(__dirname, './src/stylus/style.less/varibles.less'),
      ],
    },
  },
  // 对内部的 webpack 配置进行更细粒度的修改
  chainWebpack: (config) => {
    // config.entry.app = ["babel-polyfill", resolve('src/main.js')],
    // 路径别名配置
    config.resolve.alias.set('@', resolve('src'))
    // config.entry('main').add('babel-polyfill')
    const types = ['vue-modules', 'vue', 'normal-modules', 'normal']
    types.forEach((type) =>
      addStyleResource(config.module.rule('less').oneOf(type))
    )
  },
  // webpack 配置
  configureWebpack: (config) => {
    // 打包去除console.log配置
    if (process.env.NODE_ENV === 'production') {
      config.mode = 'production'
      config['performance'] = {
        //打包文件大小配置
        maxEntrypointSize: 10000000,
        maxAssetSize: 30000000,
      }
    }

    // 解决chunk-vendors文件过大
    config.plugins = [
      ...config.plugins,
      new CompressionWebpackPlugin({
        filename: '[path][base].gz',
        algorithm: 'gzip',
        test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
        threshold: 10240, // 对超过10K的数据进行压缩
        minRatio: 0.8, // 极小比
        deleteOriginalAssets: false, // 正式环境发布时删除源文件
      }),
    ]
  },
})
